"use strict";
console.log(123);
//定义food类
class Food {
    constructor() {
        this.element = document.getElementById('food');
    }
    //定义一个获取食物x轴坐标的方法
    get X() {
        return this.element.offsetLeft;
    }
    //定义一个获取食物Y轴坐标的方法
    get Y() {
        return this.element.offsetTop;
    }
    //修改食物位置的方法
    change() {
        //生成一个随机的位置
        //食物的位置最小是0最大是290
        //蛇移动一次就是一格，一格大小就是10，所以就要求食物的作标必须是整值10的倍数
        let left = Math.round(Math.random() * 29) * 10;
        let top = Math.round(Math.random() * 29) * 10;
        this.element.style.left = left + 'px';
        this.element.style.top = top + 'px';
    }
}
//测试代码
// const food = new Food();
// food.change();
// console.log(food.X, food.Y);
//定义表示记分牌的类
class ScorePanel {
    constructor(maxLevel = 10, upScore = 10) {
        //score和level用来记录分数和等级
        this.score = 0;
        this.level = 1;
        this.scoreEle = document.getElementById('score');
        this.levelEle = document.getElementById('level');
        this.maxLevel = maxLevel;
        this.upScore = upScore;
    }
    //设置一个加分的方法
    addScore() {
        //使分数自增
        this.score++;
        this.scoreEle.innerHTML = this.score + '';
        //判断分数是多少
        if (this.score % this.upScore == 0) {
            this.levelUp();
        }
    }
    //提升等级的方法
    levelUp() {
        if (this.level < this.maxLevel) {
            this.levelEle.innerHTML = ++this.level + '';
        }
    }
}
//测试代码
// const scorePanel = new ScorePanel(100, 2);
// for (let i = 0; i < 200; i++) {
//     scorePanel.addScore();
// }
class Snake {
    constructor() {
        this.element = document.getElementById('snake');
        this.head = document.querySelector('#snake>div');
        this.bodies = this.element.getElementsByTagName('div');
    }
    //获取蛇的作标（蛇头作标）
    get X() {
        return this.head.offsetLeft;
    }
    get Y() {
        return this.head.offsetTop;
    }
    //设置蛇头的作标
    set X(value) {
        //如果新旧值相同，则不用更改
        if (this.X == value) {
            return;
        }
        if (value < 0 || value > 290) {
            //进入判断，说明蛇撞墙了
            throw new Error("蛇撞墙了");
        }
        //禁止掉头
        if (this.bodies[1] && this.bodies[1].offsetLeft === value) {
            // console.log('水平方向发生掉头');
            //如果发生掉头，让蛇反方向继续移动
            if (value > this.X) {
                //如果新值value大于X，则说明蛇在向右走，此时发生掉头，继续向左
                value = this.X - 10;
            }
            else {
                value = this.X + 10;
            }
        }
        //移动身体
        this.moveBody();
        this.head.style.left = value + 'px';
        //检查撞没撞自己
        this.checkBody();
    }
    set Y(value) {
        if (this.Y == value) {
            return;
        }
        if (value < 0 || value > 290) {
            //蛇撞墙了，抛出一个异常
            throw new Error("蛇撞墙了");
        }
        //禁止掉头
        if (this.bodies[1] && this.bodies[1].offsetTop === value) {
            // console.log('水平方向发生掉头');
            //如果发生掉头，让蛇反方向继续移动
            if (value > this.Y) {
                value = this.Y - 10;
            }
            else {
                value = this.Y + 10;
            }
        }
        //移动身体
        this.moveBody();
        this.head.style.top = value + 'px';
        //检查撞没撞自己
        this.checkBody();
    }
    //蛇增加身体的方法
    addBody() {
        //向element中添加一个div
        this.element.insertAdjacentHTML("beforeend", "<div></div>");
    }
    //添加一个蛇身体移动的方法
    moveBody() {
        //将后面的身体设置为前边身体的位置
        //遍历所有身体
        for (let i = this.bodies.length - 1; i > 0; i--) {
            //获取前面身体的位置
            let X = this.bodies[i - 1].offsetLeft;
            let Y = this.bodies[i - 1].offsetTop;
            //将值设置到当前身体
            this.bodies[i].style.left = X + 'px';
            this.bodies[i].style.top = Y + 'px';
        }
    }
    checkBody() {
        //获取所有的身体，检查是否和蛇头重叠
        for (let i = 1; i < this.bodies.length; i++) {
            let bd = this.bodies[i];
            if (this.X === bd.offsetLeft && this.Y === bd.offsetTop) {
                //说明撞到身体，游戏结束
                throw new Error('撞到自己了！');
            }
        }
    }
}
//控制其他的所有类
class GameControl {
    constructor() {
        //创建一个属性来存储蛇的移动方向（也是按键的方向）
        this.direction = '';
        //创建一个属性用来记录游戏是否结束
        this.isLive = true;
        this.snake = new Snake();
        this.food = new Food();
        this.scorePanel = new ScorePanel();
        this.init();
    }
    //游戏的初始化方法，调用后游戏即开始
    init() {
        //绑定键盘按下的事件
        document.addEventListener('keydown', this.keydownHandler.bind(this));
        //调用run方法，使蛇移动
        this.run();
    }
    //创建一个键盘按下的响应函数
    keydownHandler(event) {
        //需要检查event.key的值是否合法（用户是否按了正确的按键）
        //修改direction的属性
        this.direction = event.key;
    }
    //创建一个控制蛇移动的方法
    run() {
        //根据方向（this.direction）来使蛇的位置改变
        //先获取蛇现在的作标
        let X = this.snake.X;
        let Y = this.snake.Y;
        switch (this.direction) {
            case "ArrowUp":
            case "up":
                //向上移动 top减少
                Y -= 10;
                break;
            case "ArrowDown":
            case "Down":
                //向下移动 top增加
                Y += 10;
                break;
            case "ArrowLeft":
            case "Left":
                //向左移动 left减少
                X -= 10;
                break;
            case "ArrowRight":
            case "Right":
                //向右移动 left增加
                X += 10;
                break;
        }
        //检查蛇是否吃到了食物
        this.checkEat(X, Y);
        //修改蛇的X和Y值
        try {
            this.snake.X = X;
            this.snake.Y = Y;
        }
        catch (e) {
            //进入catch，游戏异常，弹出提示信息
            alert(e.message + 'GAME OVER!');
            this.isLive = false;
        }
        //开启一个定时的调用
        this.isLive && setTimeout(this.run.bind(this), 300 - (this.scorePanel.level - 1) * 30);
    }
    //定义一个方法，用来检查蛇是否吃到了食物
    checkEat(X, Y) {
        if (X === this.food.X && Y === this.food.Y) {
            // console.log('吃到了');
            //食物位置重置
            this.food.change();
            //分数增加
            this.scorePanel.addScore();
            //蛇增加一节
            this.snake.addBody();
        }
    }
}
const gameControl = new GameControl();
// setInterval(function () {
//     console.log(gameControl.direction);
// }, 1000)
